/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.uoc.tdp.beans.proves;

import edu.uoc.tdp.beans.conexio.ResponsableEvents;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 *
 * @author 1X4j
 */

// TODO NOTES XMARTI
/* En principi la donc per definitiva. 
 * Tot i que es possible que afegeixi algun altre constructor, de cares  a la 
 * Implementació de l'auditoria. 
 * 
 * Implemento operacions de:
 * Get respostes correctes comparant amb respostes estudiants
 * Get respostes incorrectes comparant amb respostes estudiants
 * Get NotaRonda            comparant amb respostes estudiants
 * 
 */
public class Ronda implements Serializable {
    private Integer nombrePreguntes;    
    private Date dataIniRealitzacio;
    private Date dataFiRealitzacio;
    private List<PreguntaResposta> respostesRonda;
    private Date dataAlta;
    private ResponsableEvents usuariAlta;
    private Date dataModificacio;
    private ResponsableEvents usuariModificacio;
    private Date dataBaixa;
    private ResponsableEvents usuariBaixa;
    private static final long serialVersionUID = 1L;
    public Ronda(){}
    /**
     * Constructor de Ronda amb 5 paràmetres
     * @param pNombrePreguntes          Total de preguntes que conté la Ronda   
     * @param pDataIniRealitzacio       Data d'inici per a realitzar la Ronda
     * @param pDataFiRealitzacio        Data final per a realitzar la Ronda
     * @param pRespostesCorrectes       Llista de respostes correctes que conté la ronda 
     */
    public Ronda(Integer pNombrePreguntes,Date pDataIniRealitzacio, Date pDataFiRealitzacio,
                 List<PreguntaResposta>pRespostesCorrectes){
        this.nombrePreguntes=pNombrePreguntes;        
        this.dataIniRealitzacio=pDataIniRealitzacio;
        this.dataFiRealitzacio=pDataFiRealitzacio;
        this.respostesRonda=pRespostesCorrectes;        
    }
    /**
     * Accessor de lectura de la data de creació de la ronda.
     * @return dataAlta         Data d'alta.
     */
    public Date getDataAlta() {
        return dataAlta;
    }
    /**
     *  Accessor d'escriptura de data de creació de la ronda.
     * @param dataAlta          data d'alta.
     * */
    public void setDataAlta(Date dataAlta) {
        this.dataAlta = dataAlta;
    }
    /**
     * Accessor de lectura de la data de baixa de la ronda.
     * @return  dataBaixa       data de baixa.
     */
    public Date getDataBaixa() {
        return dataBaixa;
    }
    /**
     * Accessor d'escriptura de data de baixa de la ronda.
     * @param dataBaixa         data de baixa.
     */
    public void setDataBaixa(Date dataBaixa) {
        this.dataBaixa = dataBaixa;
    }
    /**
     * Accessor de lectura de data final de realització de la ronda.
     * @return dataFiRealitzacio    data fi de realització.   
     */
    public Date getDataFiRealitzacio() {
        return dataFiRealitzacio;
    }
    /**
     * Accessor d'escriptura de data final de realització de la ronda.
     * @param dataFiRealitzacio     data fi de realització.
     */
    public void setDataFiRealitzacio(Date dataFiRealitzacio) {
        this.dataFiRealitzacio = dataFiRealitzacio;
    }
    /**
     * Accessor de lectura de data inici de realització de la ronda.
     * @return dataIniRealitzacio   data inici de realització.
     */
    public Date getDataIniRealitzacio() {
        return dataIniRealitzacio;
    }
    /**
     * Accessor d'escriptura de data d'inici de realització de la ronda
     * @param dataIniRealitzacio    data inici de realització. 
     */
    public void setDataIniRealitzacio(Date dataIniRealitzacio) {
        this.dataIniRealitzacio = dataIniRealitzacio;
    }
    /**
     * Accessor de lectura de data de modificacio de la ronda.
     * @return dataModificacio      data de modificació de la ronda.
     */
    public Date getDataModificacio() {
        return dataModificacio;
    }
    /**
     * Accessor d'escriptura de data de modificació de la ronda.
     * @param dataModificacio       data de modificacio de la ronda.
     */
    public void setDataModificacio(Date dataModificacio) {
        this.dataModificacio = dataModificacio;
    }
    /**
     * Accessor de lectura del nombre de preguntes que consta la ronda.
     * @return nombrePreguntes      total preguntes de la ronda.
     */
    public Integer getNombrePreguntes() {
        return nombrePreguntes;
    }
    /**
     * Accessor d'escriptura del nombre de preguntes de la ronda.
     * @param nombrePreguntes       total preguntes de la ronda.
     */
    public void setNombrePreguntes(Integer nombrePreguntes) {
        this.nombrePreguntes = nombrePreguntes;
    }
    /**
     *  Accessor de lectura de la llista de respostes de la ronda.
     * @return respostesCorrectes   Llista de respostes correctes.
     */
    public List<PreguntaResposta> getRespostesRonda() {
        return respostesRonda;
    }
    /**
     *  Accessor d'escriptura  de la llista de respostes de la ronda.
     * @param respostesCorrectes    Llista de respostes correctes. 
     */
    public void setRespostesRonda(List<PreguntaResposta> pRespostesRonda) {
        this.respostesRonda = pRespostesRonda;
    }
    
    /**
     * Accessor de lectura d'una reposta correcta de la ronda.
     * @param pPregunta         Numero de pregunta.
     * @return RespostaCorrecta Resposta correcte.             
     */
    public PreguntaResposta getRespostaCorrecte(Integer pPregunta){      
        PreguntaResposta respostaCorrecta=null;
        for(PreguntaResposta rc:respostesRonda){
            if(rc.getPregunta()==pPregunta){
                respostaCorrecta=rc;
            }
        }        
        return respostaCorrecta;
    }    
    /**
     * Accessor d'escriptura d'una resposta de la ronda <br>
     * Afegeix una reposta correcta a la llista de respostes de la ronda.
     * @param pResposta         Pregunta de la roonda
     */
    public void setRepostaRonda(PreguntaResposta pResposta){
        respostesRonda.add(pResposta);
    }
    /**
     * Accessor de comprovació d'una reposta de la ronda.<br>
     * Comprova si una resposta es correcta
     * @param pr        reposta a comprobar
     * @return CERT: si es correcta, FALS: en cas contrari
     */
    private boolean esRespostaCorrecta(PreguntaResposta pr){
        PreguntaResposta prCorrecte=this.getRespostaCorrecte(pr.getPregunta());
        return prCorrecte.equals(pr);        
    }
    /**
     * Accessor de lectura del resultat d'una resposta.<br>
     * Retorna la puntuació obtinguda en una pregunta de la ronda
     * @param pr            Pregunta amb la seva resposta
     * @return resultat     0 si no hi ha resposta, -0.5 si no es correcta i 1 si es correcta
     */
    private float resultatPreguntaResposta(PreguntaResposta pr){
        float resultat;
        if(pr==null){
            resultat=0;
        
        }else if(esRespostaCorrecta(pr)){
            resultat=1;
        }else{
            resultat=(float)-0.5;
        }
        return resultat;
    }
    /**
     * Accessor de lectura que obté la nota de la  ronda.<br>
     * Calcula la nota d'una ronda que ha realitzat un estudiant
     * @param respostesEstudiant    Respostes de l'estudiant
     * @return resultat             nota obtinguda per l'estudiant
     */
    public float getNotaRonda(List<PreguntaResposta>respostesEstudiant){
        float resultat=0;
            for(PreguntaResposta re:respostesEstudiant){
                  resultat=resultat+resultatPreguntaResposta(re);
            }
        return resultat;
    }
    /**
     * Accessor de lectura que obté les respostes correctes d'una Ronda.<br>
     * Calcula les respotes encertades d'una ronda que ha realitzat un estudiant
     * @param respostesEstudiant    Respostes de l'estudiant
     * @return respostesCorrectes   Total de les respostes encertades
     */
    public int getRespostesCorrectes(List<PreguntaResposta>respostesEstudiant){
        Integer respostesCorrectes=0;
        for(PreguntaResposta re:respostesEstudiant){
            if(esRespostaCorrecta(re))respostesCorrectes++;
        }
        return respostesCorrectes;
    }
    /**
     * Accessor de lectura que obté les respostes incorrectes d'una Ronda.<br>
     * Calcula les respotes no encertades d'una ronda que ha realitzat un estudiant
     * @param respostesEstudiant    Respostes de l'estudiant
     * @return respostesIncorrectes Total de les respostes Incorrectes
     */
    public int getRespostesIncorrectes(List<PreguntaResposta>respostesEstudiant){
        Integer respostesIncorrectes=0;
        for(PreguntaResposta re:respostesEstudiant){
            if(re!=null && !esRespostaCorrecta(re))respostesIncorrectes++;
        }
        return respostesIncorrectes;
    }
    
    /**
     * Accessor de lectura del responsable de donar d'alta la ronda.
     * @return usuariAlta    usuari Responsable d'events.
     */
    public ResponsableEvents getUsuariAlta() {
        return usuariAlta;
    }
    /**
     * Accessor d'escriptura del responsable de donar d'alta la ronda.
     * @param usuariAlta     usuari responsable d'events.
     */
    public void setUsuariAlta(ResponsableEvents usuariAlta) {
        this.usuariAlta = usuariAlta;
    }
    /**
     * Accessor de lectura del responsable de donar de baixa la ronda.
     * @return usuariBaixa  usuari reponsable d'events.
     */
    public ResponsableEvents getUsuariBaixa() {
        return usuariBaixa;
    }
    /**
     * Accessor d'escriptura del responsable de donar de baixa la ronda.
     * @param usuariBaixa   usuari responsable d'events.
     */
    public void setUsuariBaixa(ResponsableEvents usuariBaixa) {
        this.usuariBaixa = usuariBaixa;
    }
    /**
     * Accessor de lectura del responsable de modificar una ronda.
     * @return usuariModificacio    usuari reponsable d'events.
     */
    public ResponsableEvents getUsuariModificacio() {
        return usuariModificacio;
    }
    /**
     * Accessor d'escriptura del responsable de modificar la ronda.
     * @param usuariModificacio 
     */
    public void setUsuariModificacio(ResponsableEvents usuariModificacio) {
        this.usuariModificacio = usuariModificacio;
    }
    
}
